/**
 * @file .
 * @author wangxiaowei0303@163.com
 * 当前项目中使用到的异常基类.
 */

#ifndef org_wxw0303_bishe_src_exception_util_h_
#define org_wxw0303_bishe_src_exception_util_h_

#include <string>
#include <stdexcept>

/**
 * Exception;异常类;
 * 属性;
 *   异常码;整数类型;主要用于程序处理;
 *   异常说明串;字符串类型;是为了显示给用户看.
 */
class Exception:public std::exception {
public:
    inline Exception(const std::string &str,int errCode = 0);

    inline void setErrCode(int errCode);
    inline void setErrStr(const std::string &str);
    inline std::string& errStr();

    inline int errCode()const;
    inline const std::string& errStr()const;

    virtual const char* what()const throw();
    virtual ~Exception() throw();
private:
    int err_code_;
    std::string err_str_;
};

/**
 *  抛出 std::runtime_error 异常,异常描述为 format 格式化后的字符串.
 *  @param format 若为0,则视为空串.
 */
void throwException(const char *format,...);

#define THROW(format,...) throwException(format,##__VA_ARGS__)

// ---函数实现--------------------------------------------------------------------
inline
Exception::Exception(const std::string &str,int errCode):
    err_code_(errCode),
    err_str_(str)
{
    ;
}

inline void 
Exception::setErrCode(int errCode)
{
    err_code_ = errCode;
}

inline void 
Exception::setErrStr(const std::string &str)
{
    err_str_ = str;
}

inline std::string& 
Exception::errStr()
{
    return err_str_;
}

inline int 
Exception::errCode() const
{
    return err_code_;
}

inline const std::string& 
Exception::errStr() const
{
    return err_str_;
}

#endif // org_wxw_BaseUtil_include_exception_exception_h_

